home *** CD-ROM | disk | FTP | other *** search
- #define POLY 0x8408
- /*
- // 16 12 5
- // this is the CCITT CRC 16 polynomial X + X + X + 1.
- // This works out to be 0x1021, but the way the algorythm works
- // lets us use 0x8408 (the reverse of the bit pattern). The high
- // bit is always assumed to be set, thus we only use 16 bits to
- // represent the 17 bit value.
- */
-
- unsigned short crc16(char *data_p, unsigned short length)
- {
- unsigned char i;
- unsigned int data;
- unsigned int crc = 0xffff;
-
- if (length == 0)
- return (~crc);
-
- do
- {
- for (i=0, data=(unsigned int)0xff & *data_p++;
- i < 8;
- i++, data >>= 1)
- {
- if ((crc & 0x0001) ^ (data & 0x0001))
- crc = (crc >> 1) ^ POLY;
- else crc >>= 1;
- }
- } while (--length);
-
- crc = ~crc;
- data = crc;
- crc = (crc << 8) | (data >> 8 & 0xff);
-
- return (crc);
- }
-